import {
  mergeLocalCart,
  findCartList,
  insertCart,
  deleteCart,
  updateCart,
  checkAllCart
} from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  getters: {
    /**
    * 1. 有效商品列表
    * 2. 选中的购物车商品数据
    * 3. 选中商品总价
    * 4. 购物车中有效商品是否是全部选中状态
    * 注：多种写法书写的函数
    */
    // 1. 有效商品列表
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 2. 选中的购物车商品数据
    checkedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 3. 选中商品总价
    checkedTotal (state, getters) {
      return getters.checkedList.reduce((sum, item) => {
        return (sum += item.count * item.nowPrice)
      }, 0)
    },
    // 4. 购物车中有效商品是否是全部选中状态
    isAll (state, getters) {
      return getters.validList.every(item => item.selected)
    }
  },
  mutations: {
    addCart (state, currGood) {
      /**
    1. 约定本地存储的信息内容 （定义state）
    2. 编写mutations添加购物车逻辑  （unshift新增 + 同项数量加一）
    3. 编写actions进行添加操作（区分登录和未登录）
    4. 在商品详情页实现添加逻辑触发action函数
    */
      // 判断列表内是否已有同类型商品
      const goodIndex = state.list.findIndex(item => {
        return item.skuId === currGood.skuId
      })
      if (goodIndex === -1) {
        state.list.unshift(currGood)
      } else {
        state.list[goodIndex].count += currGood.count
      }
    },
    setSelected (state, { good, sel }) {
      const theGood = state.list.find(item => {
        return item.skuId === good.skuId
      })
      theGood.selected = sel
    },
    setSelectAll (state, sel) {
      return state.list.forEach(item => (item.selected = sel))
    },
    delGood (state, good) {
      const i = state.list.findIndex(item => {
        return item.skuId === good.skuId
      })
      state.list.splice(i, 1)
    },
    setCount (state, { good, num }) {
      const theGood = state.list.find(item => item.skuId === good.skuId)
      theGood.count = num
    },
    // 修改购物车列表
    setList (state, list) {
      state.list = list
    }
  },
  actions: {
    // 添加购物车
    async addCartAction ({ commit, rootState, dispatch }, currGood) {
      // 判断是否登录
      if (rootState.user.profile.token) {
        // 登陆了
        await insertCart(currGood)
        dispatch('getListAction')
        return '加入购物车成功！'
      } else {
        // 未登录
        commit('addCart', currGood)
        return '添加到购物车成功！'
      }
    },
    // 单选框同步
    async setSelectedAction ({ commit, rootState, dispatch }, { good, sel }) {
      // 判断是否登录
      if (rootState.user.profile.token) {
        // 登陆了
        await updateCart({ ...good, selected: sel })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('setSelected', { good, sel })
      }
    },
    // 多选框同步
    async setSelectAllAction ({ commit, rootState, getters, dispatch }, sel) {
      // 判断是否登录
      if (rootState.user.profile.token) {
        // 登陆了
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: sel, ids })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('setSelectAll', sel)
      }
    },
    // 删除商品
    async delGoodAction ({ commit, rootState, dispatch }, good) {
      // 判断是否登录
      if (rootState.user.profile.token) {
        // 登陆了
        await deleteCart([good.skuId])
        dispatch('getListAction')
      } else {
        // 未登录
        commit('delGood', good)
      }
    },
    // 修改数量
    async setCountAction ({ commit, rootState, dispatch }, { good, num }) {
      // 判断是否登录
      if (rootState.user.profile.token) {
        // 登陆了
        await updateCart({ ...good, count: num })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('setCount', { good, num })
      }
    },
    // 1.合并购物车
    async mergeCartList ({ state, dispatch }) {
      if (state.list.length) {
        const localList = state.list.map(({ skuId, selected, count }) => {
          return {
            skuId,
            selected,
            count
          }
        })
        await mergeLocalCart(localList)
      }
      dispatch('getListAction')
    },
    // 2.获取登陆后的购物车列表并更新vuex
    async getListAction ({ commit }) {
      const { result } = await findCartList()
      commit('setList', result)
    }
  }
}
